package Partido;

import equipos.Equipo;

/**
 * TODO: description
 */
public class PartidoDeCopa extends Partido {
    /* VARIABLES DE INSTANCIA */
    private PartidoSimple partido1;

    private PartidoSimple partido2;

    Integer campoDeGolesParaPenalesFormacion1;

    Integer campoDeGolesParaPenalesFormacion2;

    public PartidoDeCopa() {
    }

    public PartidoSimple getPartido1() {
        return this.partido1;
    }

    public void setPartido1(final PartidoSimple partido1) {
        this.partido1 = partido1;
    }

    public PartidoSimple getPartido2() {
        return this.partido2;
    }

    public void setPartido2(final PartidoSimple partido2) {
        this.partido2 = partido2;
    }

    public Integer getCampoDeGolesParaPenalesFormacion1() {
        return this.campoDeGolesParaPenalesFormacion1;
    }

    public void setCampoDeGolesParaPenalesFormacion1(final Integer campoDeGolesParaPenalesFormacion1) {
        this.campoDeGolesParaPenalesFormacion1 = campoDeGolesParaPenalesFormacion1;
    }

    public Integer getCampoDeGolesParaPenalesFormacion2() {
        return this.campoDeGolesParaPenalesFormacion2;
    }

    public void setCampoDeGolesParaPenalesFormacion2(final Integer campoDeGolesParaPenalesFormacion2) {
        this.campoDeGolesParaPenalesFormacion2 = campoDeGolesParaPenalesFormacion2;
    }

    /* CONSTRUCTOR */
    public PartidoDeCopa(final PartidoSimple partido1, final PartidoSimple partido2) {

        this.partido1 = partido1;
        this.partido2 = partido2;
        this.equipo1 = partido1.getEquipo1();
        this.equipo2 = partido1.getEquipo2();
        this.campoDeGolesParaPenalesFormacion1 = null;
        this.campoDeGolesParaPenalesFormacion2 = null;
        this.equipoGanador = this.obtenerGanador();
    }

    @Override
    public Equipo obtenerGanador() {

        Equipo ganadorPartido1 = this.partido1.obtenerGanador();
        Equipo ganadorPartido2 = this.partido2.obtenerGanador();
        boolean hayGanador = !(ganadorPartido1 == null && ganadorPartido2 == null);
        boolean condicion1 = ganadorPartido1 == ganadorPartido2;
        boolean e1null = ganadorPartido1 == null;
        boolean e2null = ganadorPartido2 == null;
        Equipo equipoGanador = null;

        if (hayGanador) {
            // Pregunto si los dos partidos los gano el equipo1, o si gano el primero y empato el segundo
            if (condicion1 || !e1null && e2null) {
                equipoGanador = ganadorPartido1;
            } else { // Los partidos no fueron ganados por el mismo o el que gano el primero empato el segundo
                if (e1null && !e2null) {
                    equipoGanador = ganadorPartido2;
                }
                // Ganaron un partido cada uno
                else {
                    equipoGanador = this.diferenciaDeGol();
                }
            }
        }
        // No hubo equipo ganador, se define por penales
        else {
            equipoGanador = this.irALosPenales();
        }
        return equipoGanador;
    }

    private Equipo diferenciaDeGol() {
        int golesF1 = this.partido1.getCampoDeGolesEquipo1() + this.partido2.getCampoDeGolesEquipo1();
        int golesF2 = this.partido1.getCampoDeGolesEquipo2() + this.partido2.getCampoDeGolesEquipo2();

        // La formacion 1 tiene mayor diferencia de gol que la formacion 2
        if (golesF1 > golesF2) {
            return this.partido1.getEquipo1();
        } else {
            // La formacion 2 tiene mayor diferencia de gol
            if (golesF2 < golesF1) {
                return this.partido1.getEquipo2();
            } else { // Tienen igual diferencia de gol
                return this.irALosPenales();
            }
        }
    }

    private Equipo irALosPenales() {
        // Me aseguro que no empaten en los penales y que no hagan mas de 5 goles cada uno
        while (this.campoDeGolesParaPenalesFormacion1 == this.campoDeGolesParaPenalesFormacion2) {
            this.campoDeGolesParaPenalesFormacion1 = (int) (Math.random() * 6);
            this.campoDeGolesParaPenalesFormacion2 = (int) (Math.random() * 6);
        }
        // Pregunto si el equipo 1 metio mas goles en penales que el equipo 2
        if (this.campoDeGolesParaPenalesFormacion1 > this.campoDeGolesParaPenalesFormacion2) {
            return this.partido1.getEquipo1();
        } else {// En los penales no hay empate
            return this.partido1.getEquipo2();
        }
    }

}
